/**
 * @file json.h
 * @author yonglin_zhang
 * @brief json轻量化接口
 * @version 0.1
 * @date 2023-08-09
 * 
 * @copyright Copyright (c) 2023
 * 
 */

#ifndef JSON_H
#define JSON_H

#define JSON_OK              0x0000 // 成功
#define JSON_ERR_BAD_INPUT   0x0001 // 非法的输入，请检查输入参数
#define JSON_ERR_CREATE_DATA 0x0002 // JSON创建json data数据时失败
#define JSON_ERR_MALLOC      0x0003 // JSON申请内存失败
#define JSON_ERR_BAD_JSON    0x0004 // 非json字符串

typedef struct _json_node json_handler;    // 最小json信息单元key-value

typedef enum {
    JSON_STRING,
    JSON_INT,
    JSON_DOUBLE,
}data_type;

/**
 * @brief 添加一个节点，如果handler没有被初始化则会自动初始化
 * 
 * @warning 注意，*handler要么为NULL，要么就是初始化过的，否则会导致调用崩溃
 * 
 * @param handler json句柄
 * @param key 键值
 * @param data 添加的内容
 * @param type 内容的类型
 * @return int 
 */
int json_add_data(json_handler **handler, const char *key, void *data, data_type type);

/**
 * @brief 添加孩子节点到最尾部
 * 
 * @warning 用后请不要将child_value释放，内部是浅拷贝
 * 
 * @param handler 
 * @param key
 * @param child 
 * @return int 
 */
int json_add_child(json_handler **handler, const char *key, json_handler *child_value);

/**
 * @brief 释放全部节点
 * 
 * @param handler 
 */
void json_free_all(json_handler **handler);

/**
 * @brief 打印json信息
 * 
 * @param handler 
 */
void json_print(json_handler *handler);

/**
 * @brief 解析json字符串
 * 
 * @param handler 解析后存放的句柄
 * @param in 输入的json字符串
*/
int json_parse(json_handler **handler, const char *in);

void json_debug_print_all(json_handler *handler);

#endif